import { useDesigner } from '../DesignerRuntime'
import { DESIGNER_EXTENSION_POINT } from '../core/DesignerEngine'
import { PropertyEditor, WidgetDescriptor } from '../core/WidgetProtocol'
import { containers, basicFields, advancedFields, customFields } from '../../../components/form-designer/widget-panel/widgetsConfig'

export class LegacyAdapter {
  static registerLegacyWidgets() {
    const engine = useDesigner()
    const registry = engine.getExtension(DESIGNER_EXTENSION_POINT.WIDGET_REGISTRY)

    // 合并所有小部件配置
    const allWidgets = [...containers, ...basicFields, ...advancedFields, ...customFields]
    
    allWidgets.forEach((config) => {
      const type = config.type
      const descriptor: WidgetDescriptor = {
        type,
        category: config.category === 'container' ? 'container' : 'field',
        icon: config.icon,
        formItem: config.formItemFlag !== false,
        initConfig: () => ({
          type,
          ...config.options,
          // 如果有 widgetList，确保它是一个数组
          ...(config.widgetList ? { widgetList: [...config.widgetList] } : {}),
          // 如果有 cols，确保它是一个数组
          ...(config.cols ? { cols: [...config.cols] } : {}),
          // 如果有 rows，确保它是一个数组
          ...(config.rows ? { rows: [...config.rows] } : {}),
          // 如果有 tabs，确保它是一个数组
          ...(config.tabs ? { tabs: [...config.tabs] } : {})
        }),
        propertyEditors: this.convertPropertyEditors(config)
      }
      
      registry.registerWidget(descriptor)
    })
  }

  private static convertPropertyEditors(legacyConfig: any): PropertyEditor[] {
    // 这里实现旧属性编辑器到新协议的转换
    // 基于小部件配置中的 options 对象
    
    const propertyEditors: PropertyEditor[] = []
    const eventEditors: PropertyEditor[] = []
    
    // 如果配置中有 options 属性，则使用它来确定要包含哪些属性编辑器
    if (legacyConfig.options) {
      // 遍历配置中的属性
      Object.entries(legacyConfig.options).forEach(([propName, propValue]: [string, any]) => {
        // 处理事件处理程序属性（以 'on' 开头的属性）
        if (propName.startsWith('on')) {
          const eventEditor: PropertyEditor = {
            name: propName,
            // 使用事件名作为标签，首字母大写，去掉 'on' 前缀
            label: propName.charAt(2).toUpperCase() + propName.slice(3),
            // 事件处理程序使用 'code-editor' 类型
            editorType: 'code-editor',
            // 默认值为空字符串
            defaultValue: ''
          }
          
          // 添加到事件编辑器数组
          eventEditors.push(eventEditor)
          return
        }
        
        // 创建一个基本的属性编辑器
        const propertyEditor: PropertyEditor = {
          name: propName,
          // 使用属性名作为标签，首字母大写
          label: propName.charAt(0).toUpperCase() + propName.slice(1),
          // 默认编辑器类型为 'input'
          editorType: 'input',
          // 如果有默认值，则包含它
          ...(propValue !== undefined ? { defaultValue: propValue } : {})
        }
        
        // 根据属性值类型设置编辑器类型
        if (typeof propValue === 'boolean') {
          propertyEditor.editorType = 'switch'
        } else if (typeof propValue === 'number') {
          propertyEditor.editorType = 'number'
        } else if (Array.isArray(propValue)) {
          propertyEditor.editorType = 'array'
        }
        
        // 特殊处理某些属性
        if (propName === 'optionItems') {
          propertyEditor.editorType = 'options'
        } else if (propName === 'customClass') {
          propertyEditor.editorType = 'custom-class'
        } else if (propName === 'labelWidth') {
          propertyEditor.editorType = 'label-width'
        } else if (propName === 'labelAlign') {
          propertyEditor.editorType = 'select'
          propertyEditor.options = [
            { label: 'Left', value: 'left' },
            { label: 'Right', value: 'right' },
            { label: 'Top', value: 'top' }
          ]
        } else if (propName === 'size') {
          propertyEditor.editorType = 'select'
          propertyEditor.options = [
            { label: 'Default', value: '' },
            { label: 'Medium', value: 'medium' },
            { label: 'Small', value: 'small' },
            { label: 'Mini', value: 'mini' }
          ]
        } else if (propName === 'type' && legacyConfig.type === 'input') {
          propertyEditor.editorType = 'select'
          propertyEditor.options = [
            { label: 'Text', value: 'text' },
            { label: 'Password', value: 'password' },
            { label: 'Number', value: 'number' },
            { label: 'Email', value: 'email' },
            { label: 'URL', value: 'url' },
            { label: 'Tel', value: 'tel' }
          ]
        } else if (propName === 'type' && legacyConfig.type === 'date') {
          propertyEditor.editorType = 'select'
          propertyEditor.options = [
            { label: 'Date', value: 'date' },
            { label: 'Week', value: 'week' },
            { label: 'Month', value: 'month' },
            { label: 'Year', value: 'year' },
            { label: 'Dates', value: 'dates' }
          ]
        } else if (propName === 'type' && legacyConfig.type === 'date-range') {
          propertyEditor.editorType = 'select'
          propertyEditor.options = [
            { label: 'Date Range', value: 'daterange' },
            { label: 'Month Range', value: 'monthrange' }
          ]
        } else if (propName === 'displayStyle') {
          propertyEditor.editorType = 'select'
          propertyEditor.options = [
            { label: 'Inline', value: 'inline' },
            { label: 'Block', value: 'block' }
          ]
        } else if (propName === 'direction') {
          propertyEditor.editorType = 'select'
          propertyEditor.options = [
            { label: 'Horizontal', value: 'horizontal' },
            { label: 'Vertical', value: 'vertical' }
          ]
        } else if (propName === 'contentPosition') {
          propertyEditor.editorType = 'select'
          propertyEditor.options = [
            { label: 'Left', value: 'left' },
            { label: 'Center', value: 'center' },
            { label: 'Right', value: 'right' }
          ]
        }
        
        // 添加到属性编辑器数组
        propertyEditors.push(propertyEditor)
      })
    }
    
    // 将属性编辑器和事件编辑器合并
    return [...propertyEditors, ...eventEditors]
  }
}